package cn.wolfcode.luowowo.mgrsite.listener;

import cn.wolfcode.luowowo.article.domain.StrategyDetail;
import cn.wolfcode.luowowo.article.service.IStrategyDetailService;
import cn.wolfcode.luowowo.cache.service.IStrategyStatisVOService;
import cn.wolfcode.luowowo.cache.util.RedisKeys;
import cn.wolfcode.luowowo.cache.vo.StrategyStatisVO;
import cn.wolfcode.luowowo.common.util.BeanUtil;
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;

import java.util.List;

//定义监听器，实现接口：ApplicationListener<ContextRefreshedEvent>


//@Component
//交给spring 管理
public class RedisDataInitListener implements ApplicationListener<ContextRefreshedEvent> {

    @Reference
    private IStrategyDetailService strategyDetailService;

    @Reference
    private IStrategyStatisVOService strategyStatisVOService;

    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        System.out.println("---------------vo 对象---begin---------------------");
        //监听器  完成功能 : 将数据库中的数据 , 存入redis中
        List<StrategyDetail> list = strategyDetailService.list();//获取所有的攻略明细
        StrategyStatisVO vo = null;
        for (StrategyDetail detail : list) {
            vo = new StrategyStatisVO();
            //判断该数据是否存在redis中 , 如果存在 , 则不修改 , 因为可能 redis中数据一直在更新 ,
            // 但初始化因为重启 , 还是从数据库中查询 , 所以需要判断
            if (strategyStatisVOService.isVOExist(detail.getId())) {
                continue;
            }
            //如果不存在 , 设置vo对象  将detail的数据 , 进行属性替换
            BeanUtil.copyProperties(vo, detail);
            vo.setStrategyId(detail.getId());
            vo.setDestId(detail.getDest().getId());
            vo.setDestName(detail.getDest().getName());
            //vo对象设置完毕属性 , 将vo对象  存入 redis中
            strategyStatisVOService.setStrategyStatisVO(vo);
        }
        System.out.println("---------------vo 对象---end---------------------");


        System.out.println("------hot热门推荐的zset的begin--------");
        //List<StrategyDetail> list = strategyDetailService.list();//获取所有的攻略明细

        for (StrategyDetail detail : list) {
            //判断该数据是否存在redis中  比如数据库数量是50 , 但是redis操作了一段时间 , 变成100 , 那么就不能替换
            //为了方法通用 , 所以传入sid , 以及zset 的 key
            if (strategyStatisVOService.isColumnExistZset(detail.getId(), RedisKeys.STRATEGY_ZSET_HOT.getPrefix())) {
                continue;
            }
            //最主要的就是进行修改分数
            int num = detail.getViewnum() + detail.getReplynum(); //阅读数以及评论数
            strategyStatisVOService.addHotScore(detail.getId(), num);
        }
        System.out.println("------hot热门推荐的zset的end--------");


        System.out.println("------国内外热门推荐的zset的begin--------");

        for (StrategyDetail detail : list) {
            //判断该数据是否存在redis中  比如数据库数量是50 , 但是redis操作了一段时间 , 变成100 , 那么就不能替换
            String key = "";
            if (detail.isIsabroad()) {
                //国外的
                key = RedisKeys.STRATEGY_ZSET_ABROAD.getPrefix();
            } else {
                //国内的
                key = RedisKeys.STRATEGY_ZSET_CHINA.getPrefix();
            }
            if (strategyStatisVOService.isColumnExistZset(detail.getId(), key)) {
                continue;
            }
            //最主要的就是进行修改分数
            int num = detail.getThumbsupnum() + detail.getFavornum(); //顶 以及 收藏
            strategyStatisVOService.addCommendScore(detail.getId(), num);
        }
        System.out.println("------hot热门推荐的zset的end--------");


        System.out.println("------查询国内最火的前10攻略显示(按照阅读量最高前10个)\n的begin--------");

        for (StrategyDetail detail : list) {
            //判断该数据是否存在redis中  比如数据库数量是50 , 但是redis操作了一段时间 , 变成100 , 那么就不能替换
            //为了方法通用 , 所以传入sid , 以及zset 的 key
            if (strategyStatisVOService.isColumnExistZset(detail.getId(), RedisKeys.STRATEGY_ZSET_CHINA_BY_VIEWNUM.getPrefix())) {
                continue;
            }
            //最主要的就是进行修改分数
            int num = detail.getViewnum(); //阅读数
            //strategyStatisVOService.addHotScore(detail.getId(), num);
            strategyStatisVOService.addViewnumScoreForChinaTen(detail.getId(), num);
        }
        System.out.println("------查询国内最火的前10攻略显示(按照阅读量最高前10个)\n的end--------");
    }
}